Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Search found 4 matches
Author Message
  Topic: Правильная схема работы с транзакциями
dimkalinux

Replies: 2
Views: 8385

PostForum: SQL и PHP :: SQL   Posted: Wed Jul 27, 2011 12:05 pm   Subject: Правильная схема работы с транзакциями
Добрый день.

Я пишу модуль БД для работы одного форума.
Текущая схема работы модля для InnoDB драйвера такая:

в начале страницы делается query('START TRANSACTION');
*** запросы к базе
в конце страницы query('COMMIT');
если в середине страницы происходит ошибка SQL-запроса делается ROLLBACK.

На этой схема произошла такая ошибка - в середине страницы при UPDATE таблицы произошел сбой PHP (не SQL) и транзакция зависла, не давая выполнить другие UPDATE запросы к этой таблицы. Помог только рестарт базы данных.

1) Как можно избежать такой ситуации в дальнейшем?
2) Может быть правильней вызывать 'START TRANSACTION' вручную только для определённых запросов, например, только перед INSERT UPDATE или вариант с автоматическим вызовом в начале страницы нормальный?
  Topic: Атомарная запись в файл + require
dimkalinux

Replies: 7
Views: 15645

PostForum: Разное :: PHP   Posted: Tue Jul 12, 2011 10:28 am   Subject: Атомарная запись в файл + require
Спасибо за помощь.
Остановлюсь на варианте с блокировкой.
  Topic: Атомарная запись в файл + require
dimkalinux

Replies: 7
Views: 15645

PostForum: Разное :: PHP   Posted: Mon Jul 11, 2011 3:40 pm   Subject: Атомарная запись в файл + require
Переписал с LOCK

function write_cache_file($file, $content)
{
// Open
$handle = @fopen($file, 'r+b'); // @ - file may not exist
if (!$handle)
{
$handle = fopen($file, 'wb');
if (!$handle)
{
return false;
}
}

// Lock
flock($handle, LOCK_EX);
ftruncate($handle, 0);

// Write
if (fwrite($handle, $content) === false)
{
// Unlock and close
flock($handle, LOCK_UN);
fclose($handle);

return false;
}

// Unlock and close
flock($handle, LOCK_UN);
fclose($handle);

return true;
}
  Topic: Атомарная запись в файл + require
dimkalinux

Replies: 7
Views: 15645

PostForum: Разное :: PHP   Posted: Mon Jul 11, 2011 2:39 pm   Subject: Атомарная запись в файл + require
Добрый день.

Пишу функцию для записи кеша в файл. необходима атомарная запись, так как файл кеша подключается через require.
Сейчас используем вариант с rename, так как rename атомарный и есстественно напоролись на грабли, так как в Виндовс rename не работает с существующим файлом-назначением. Подскажите правильный кроссплатформенный способ решения данной проблемы.

Файл кеша не читается напрямую функциями fread или подобными — только require.
Поэтому не понятно как require работает с блокировками.

Текущий вариант

function write_cache_file($file, $content)
{
$tmp_file = tempnam(FORUM_CACHE_DIR, md5($file.time().uniqid()));
if (!$tmp_file)
{
return false;
}

$fh = @/**/fopen($tmp_file, 'wb');
if (!$fh)
{
// Unlink TMP
if (file_exists($tmp_file))
{
unlink($tmp_file);
}
return false;
}

// Write
fwrite($f ...
 
Page 1 of 1 All times are GMT + 3 Hours
XML